package com.ess.base.service.impl;

import com.ess.base.service.BaseService;
import com.ess.result.ServiceResult;
import com.github.abel533.entity.Example;
import com.github.abel533.mapper.Mapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.Serializable;
import java.util.List;

/**
 * 通用mapper BaseServiceImpl
 *
 * @param <T>
 */
public abstract class BaseServiceImpl<T extends Serializable> implements BaseService<T> {

    /**
     * 日志变量
     */
    protected Logger logger = LoggerFactory.getLogger(BaseService.class);

    @Autowired
    protected Mapper<T> mapper;


    /**
     * 根据id查询数据
     *
     * @param id
     * @return
     */
    @Override
    public ServiceResult<T> queryByIdRes(Serializable id) {
        return ServiceResult.success(this.mapper.selectByPrimaryKey(id));
    }

    /**
     * 查询所有数据
     *
     * @return
     */
    @Override
    public ServiceResult<List<T>> queryAllRes() {
        return ServiceResult.success(this.mapper.select(null));
    }

    /**
     * 根据条件查询一条数据
     *
     * @param record
     * @return
     */
    @Override
    public ServiceResult<T> queryOneRes(T record) {
        return ServiceResult.success(this.mapper.selectOne(record));
    }

    /**
     * 根据条件查询数据列表
     *
     * @param record
     * @return
     */
    @Override
    public ServiceResult<List<T>> queryListByWhereRes(T record) {
        return ServiceResult.success(this.mapper.select(record));
    }

    /**
     * 分页查询数据列表
     *
     * @param page
     * @param rows
     * @param record
     * @return
     */
    @Override
    public ServiceResult<PageInfo<T>> queryPageListByWhereRes(Integer page, Integer rows, T record) {
        // 设置分页参数
        PageHelper.startPage(page, rows);
        List<T> list = this.mapper.select(record);
        return ServiceResult.success(new PageInfo<T>(list));
    }

    /**
     * 分页查询用户信息 可以设置排序，模糊查询
     *
     * @param page
     * @param rows
     * @param record
     * @param example
     * @return
     */
    @Override
    public ServiceResult<PageInfo<T>> queryPageListByExampleRes(int page, int rows, T record, Example example) {
        PageHelper.startPage(page, rows);
        List<T> list = this.mapper.selectByExample(example);
        return ServiceResult.success(new PageInfo<T>(list));
    }

    /**
     * 分页查询用户信息 可以设置排序，模糊查询
     * 该方法需要重写
     *
     * @param page
     * @param rows
     * @param record
     * @return
     */
    @Override
    public ServiceResult<PageInfo<T>> queryPageListByConditionRes(int page, int rows, T record) {
        PageHelper.startPage(page, rows);
        List<T> list = this.mapper.selectByExample(null);
        return ServiceResult.success(new PageInfo<T>(list));
    }


    /**
     * 新增数据
     *
     * @param t
     * @return
     */
    @Override
    public ServiceResult<Integer> saveRes(T t) {
        return ServiceResult.success(this.mapper.insert(t));
    }

    /**
     * 有选择的保存，选择不为null的字段作为插入字段
     *
     * @param t
     * @return
     */
    @Override
    public ServiceResult<Integer> saveSelectiveRes(T t) {
        return ServiceResult.success(this.mapper.insertSelective(t));
    }

    /**
     * 更新数据
     *
     * @param t
     * @return
     */
    @Override
    public ServiceResult<Integer> updateRes(T t) {
        return ServiceResult.success(this.mapper.updateByPrimaryKey(t));
    }

    /**
     * 有选择的更新，选择不为null的字段作为插入字段
     *
     * @param t
     * @return
     */
    @Override
    public ServiceResult<Integer> updateSelectiveRes(T t) {
        return ServiceResult.success(this.mapper.updateByPrimaryKeySelective(t));
    }

    /**
     * 根据id删除数据
     *
     * @param id
     * @return
     */
    @Override
    public ServiceResult<Integer> deleteByIdRes(Serializable id) {
        return ServiceResult.success(this.mapper.deleteByPrimaryKey(id));
    }

    /**
     * 批量删除
     *
     * @param clazz
     * @param property
     * @param values
     * @return
     */
    @Override
    public ServiceResult<Integer> deleteByIdsRes(Class<T> clazz, String property, List<Object> values) {
        Example example = new Example(clazz);
        example.createCriteria().andIn(property, values);
        return ServiceResult.success(this.mapper.deleteByExample(example));
    }

    /**
     * 根据条件删除数据
     *
     * @param record
     * @return
     */
    @Override
    public ServiceResult<Integer> deleteByWhereRes(T record) {
        return ServiceResult.success(this.mapper.delete(record));
    }


    /**
     * 根据id查询数据
     *
     * @param id
     * @return
     */
    @Override
    public T queryById(Serializable id) {
        return this.mapper.selectByPrimaryKey(id);
    }

    /**
     * 查询所有数据
     *
     * @return
     */
    @Override
    public List<T> queryAll() {
        return this.mapper.select(null);
    }

    /**
     * 根据条件查询一条数据
     *
     * @param record
     * @return
     */
    @Override
    public T queryOne(T record) {
        return this.mapper.selectOne(record);
    }

    /**
     * 根据条件查询数据列表
     *
     * @param record
     * @return
     */
    @Override
    public List<T> queryListByWhere(T record) {
        return this.mapper.select(record);
    }

    /**
     * 分页查询数据列表
     *
     * @param page
     * @param rows
     * @param record
     * @return
     */
    @Override
    public PageInfo<T> queryPageListByWhere(Integer page, Integer rows, T record) {
        // 设置分页参数
        PageHelper.startPage(page, rows);
        List<T> list = this.mapper.select(record);
        return new PageInfo<T>(list);
    }

    /**
     * 分页查询用户信息 可以设置排序，模糊查询
     *
     * @param page
     * @param rows
     * @param record
     * @param example
     * @return
     */
    @Override
    public PageInfo<T> queryPageListByExample(int page, int rows, T record, Example example) {
        PageHelper.startPage(page, rows);
        List<T> list = this.mapper.selectByExample(example);
        return new PageInfo<T>(list);
    }

    /**
     * 分页查询用户信息 可以设置排序，模糊查询
     * 该方法需要重写
     *
     * @param page
     * @param rows
     * @param record
     * @return
     */
    @Override
    public PageInfo<T> queryPageListByCondition(int page, int rows, T record) {
        PageHelper.startPage(page, rows);
        List<T> list = this.mapper.selectByExample(null);
        return new PageInfo<T>(list);
    }


    /**
     * 新增数据
     *
     * @param t
     * @return
     */
    @Override
    public Integer save(T t) {
        return this.mapper.insert(t);
    }

    /**
     * 有选择的保存，选择不为null的字段作为插入字段
     *
     * @param t
     * @return
     */
    @Override
    public Integer saveSelective(T t) {
        return this.mapper.insertSelective(t);
    }

    /**
     * 更新数据
     *
     * @param t
     * @return
     */
    @Override
    public Integer update(T t) {
        return this.mapper.updateByPrimaryKey(t);
    }

    /**
     * 有选择的更新，选择不为null的字段作为插入字段
     *
     * @param t
     * @return
     */
    @Override
    public Integer updateSelective(T t) {
        return this.mapper.updateByPrimaryKeySelective(t);
    }

    /**
     * 根据id删除数据
     *
     * @param id
     * @return
     */
    @Override
    public Integer deleteById(Serializable id) {
        return this.mapper.deleteByPrimaryKey(id);
    }

    /**
     * 批量删除
     *
     * @param clazz
     * @param property
     * @param values
     * @return
     */
    @Override
    public Integer deleteByIds(Class<T> clazz, String property, List<Object> values) {
        Example example = new Example(clazz);
        example.createCriteria().andIn(property, values);
        return this.mapper.deleteByExample(example);
    }

    /**
     * 根据条件删除数据
     *
     * @param record
     * @return
     */
    @Override
    public Integer deleteByWhere(T record) {
        return this.mapper.delete(record);
    }
}
